pyinstaller 使用过程中 一些常见的坑
2021年12月25日 00:36 · 阅读 113
关注
前言
写这篇文章的前言。 最近为方便后台程序,自测和别的部门测试,写了简略的自动化测试工具。 [基于python 3.9 和 pyqt6 ]
用到的模块有 json,google.protobuf, pandas 等模块。
在最终打包时候,却遇到了各种问题。去 度娘 找解决方案,本以为一个简单的问题,结果csdn上的文章千篇一律,都是 cv 大法,部分博客园上也是 cv,最终在 Stack Overflow 上找到了部分解决方法。加上自己项目本身遇到的问题,总结一下。
pyinstaller 本身使用
- -F 参数 生成 exe 为单exe文件
- -w 生成的exe,打开时候,会打开cmd窗口,有日志打印
- -p 生成exe时,添加额外的路径
- --hidden-import 添加额外的依赖模块,如python中相关模块
- -D 生成的exe有另外一个动态库文件夹
- -i 加exe图标
两种使用方法
- 直接使用 pyinstaller
- python 调用 pyinstaller
pyinstaller -F -w -p C:\... -p E:\... xxx.py --hidden-import google.protobuf.json_format --hidden-import pandas
python -m pyinstaller -F -w --name "xxx" "xxx.py" -p C:\... -p C:\...\...
复制代码
第一种使用,需要额外 --hidden-import 一些依赖 第二种使用,不用导入这些依赖
pyinstaller 打包后常见的bug
- 打包前 打包不成功
- 打包后,找不到模块
bug 和 解决方案
1. 打包前 可能的错误
File "E:\DevPath\python39\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 1415, in add_script
with open(pathname, 'rb') as fp:
PermissionError: [Errno 13] Permission denied: 'C:\\Repository\\code\\dev\\plt\\auto_event_score_test\\logic_behaviour'
复制代码
解决方案
尝试了第一种情况加管理员权限仍然不行。 如果你的打包不幸遇到了这种情况,用第二种使用方法就能解决。
2. 打包后 可能的错误
- BUG : no module name ‘XXX’
- 这个module 可能是python库中的模块
- module 也可能是自己 import 自己写的module
解决方法
- python 中的模块。使用 --hidden-import 参数,导入需要的 module (方法1的使用才用到,方法2一般不会遇到这种情况)
- 自己的模块 xxx 。-p [ 加上自己 import xxx 的目录 ] (如果你的项目有了很多文件夹,如果from xxx.yyy import aaa,导入-p xxx 即可。如果import 不规范,那么需要多个 -p 加上缺少模块的路径。所以说规范的重要性)
注意事项
- 运行打包后的exe,如果exe一闪而过,看不到错误信息,因为打包时候少了 -w 参数。加上 -w(小写)参数,就能够看到 “ no module xxx ”了,相应去解决就行了
- 如果使用第一种打包。有时候 no module 是exe 位置问题,看异常信息能够发现的。不过这种打包依赖别的模块(自己写的 xxx.py)
总结
简单的直接使用 pyinstaller 一般就行,使用python -m pyinstaller 保险,更简单